Use case: Initialization, configuration and filter configuration

Sequence diagram

  @startuml
            participant "User application" as App
  participant "<font color=black><b>HAL FDCAN"  as FDCAN #19DD3A

  == FDCAN HAL Initialization Global configuration ==
  App -> FDCAN: HAL_FDCAN_Init()
  note right
  Initialize the FDCAN handle and associate an instance
  Configure the FDCAN according to the application requirements
  end note
  App <--- FDCAN:<color green>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n

   == Acceptance filters configuration  ==

  App -> FDCAN: HAL_FDCAN_ConfigFilter()
  FDCAN --> App:<color green>HAL_OK
  App -> FDCAN: HAL_FDCAN_ConfigGlobalFilter()
  FDCAN --> App:<color green>HAL_OK
  App -> FDCAN: HAL_FDCAN_Start()
  FDCAN --> App:<color green>HAL_OK
  Note over App#lightyellow: Prepare the Tx Header

  @enduml

Code snippet

HAL1

HAL2

hfdcan.Instance                = FDCAN1;
hfdcan.Init.FrameFormat        = FDCAN_FRAME_FD_BRS;
hfdcan.Init.Mode               = FDCAN_MODE_NORMAL;
hfdcan.Init.AutoRetransmission = ENABLE;
hfdcan.Init.TransmitPause      = DISABLE;
hfdcan.Init.ProtocolException  = ENABLE;


hfdcan.Init.NominalPrescaler     = 0x1;
hfdcan.Init.NominalSyncJumpWidth = 0x8;
hfdcan.Init.NominalTimeSeg1      = 0x1F;
hfdcan.Init.NominalTimeSeg2      = 0x8;


hfdcan.Init.DataPrescaler     = 0x1;
hfdcan.Init.DataSyncJumpWidth = 0x4;
hfdcan.Init.DataTimeSeg1      = 0x5;
hfdcan.Init.DataTimeSeg2      = 0x4;




hfdcan.Init.StdFiltersNbr       = 1;
hfdcan.Init.ExtFiltersNbr       = 0;
hfdcan.Init.TxFifoQueueMode     = FDCAN_TX_FIFO_OPERATION;

hfdcan.Init.ClockDivider        = FDCAN_CLOCK_DIV2;
HAL_FDCAN_Init(&hfdcan);

sFilterConfig.IdType       = FDCAN_STANDARD_ID;
sFilterConfig.FilterIndex  = 0;
sFilterConfig.FilterType   = FDCAN_FILTER_MASK;
sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
sFilterConfig.FilterID1    = 0x111;
sFilterConfig.FilterID2    = 0x7FF;
HAL_FDCAN_ConfigFilter(&hfdcan, &sFilterConfig);

HAL_FDCAN_ConfigGlobalFilter(&hfdcan,
                             FDCAN_REJECT,
                             FDCAN_REJECT,
                             FDCAN_REJECT_REMOTE,
                             FDCAN_REJECT_REMOTE);


HAL_FDCAN_Start(&hfdcan);
HAL_FDCAN_Init(&hfdcan, HAL_FDCAN1);
fdcan_config.frame_format        = HAL_FDCAN_FRAME_FORMAT_FD_BRS;
fdcan_config.mode                = HAL_FDCAN_MODE_NORMAL;
fdcan_config.auto_retransmission = HAL_FDCAN_AUTO_RETRANSMISSION_ENABLE;
fdcan_config.transmit_pause      = HAL_FDCAN_TRANSMIT_PAUSE_DISABLE;
fdcan_config.protocol_exception  = HAL_FDCAN_PROTOCOL_EXCEPTION_ENABLE;

hal_fdcan_nominal_bit_timing_t fdcan_nominal_bit_timing;
fdcan_nominal_bit_timing.nominal_prescaler  = 1;
fdcan_nominal_bit_timing.nominal_jump_width = 8;
fdcan_nominal_bit_timing.nominal_time_seg1  = 31;
fdcan_nominal_bit_timing.nominal_time_seg2  = 8;

hal_fdcan_data_bit_timing_t fdcan_data_bit_timing;
fdcan_data_bit_timing.data_prescaler  = 1;
fdcan_data_bit_timing.data_jump_width = 4;
fdcan_data_bit_timing.data_time_seg1  = 5;
fdcan_data_bit_timing.data_time_seg2  = 4;

fdcan_config.nominal_bit_timing = fdcan_nominal_bit_timing;
fdcan_config.data_bit_timing    = fdcan_data_bit_timing;

fdcan_config.std_filters_nbr        = 1;
fdcan_config.ext_filters_nbr        = 0;
fdcan_config.tx_fifo_queue_mode     = HAL_FDCAN_TX_MODE_FIFO;

HAL_FDCAN_SetClockDivider(&hfdcan, HAL_FDCAN_CLOCK_DIV_2);
HAL_FDCAN_SetConfig(&hfdcan, &fdcan_config);

filter.id_type       = HAL_FDCAN_ID_STANDARD;
filter.filter_index  = 0U;
filter.filter_type   = HAL_FDCAN_FILTER_TYPE_CLASSIC;
filter.filter_config = HAL_FDCAN_FILTER_TO_RX_FIFO_0;
filter.filter_id1    = 0x111;
filter.filter_id2    = 0x7FF;
HAL_FDCAN_SetFilter(&hfdcan, &filter);

/* Configure global filter to reject non-matching and remote frames */
global_filter.acceptance_non_matching_std = HAL_FDCAN_NON_MATCHING_REJECT;
global_filter.acceptance_non_matching_ext = HAL_FDCAN_NON_MATCHING_REJECT;
global_filter.acceptance_remote_std       = HAL_FDCAN_REMOTE_REJECT;
global_filter.acceptance_remote_ext       = HAL_FDCAN_REMOTE_REJECT;
HAL_FDCAN_SetGlobalFilter(&hfdcan, &global_filter);

HAL_FDCAN_Start(&hfdcan);

Note

  • In HAL1, if the clock divider is available and set directly within the initialization structure using hfdcan.Init.ClockDivider = clock_divider.

  • In HAL2, the clock divider configuration is separated from the initialization and must be explicitly set by calling HAL_FDCAN_SetClockDivider(&hfdcan, clock_divider).

Key changes

  1. HAL2 separates global configuration from initialization using HAL_FDCAN_SetConfig().

  2. HAL2 configures filters using HAL_FDCAN_SetFilter() and HAL_FDCAN_SetGlobalFilter().

  3. When supported by the device, HAL2 configures the clock divider using HAL_FDCAN_SetClockDivider().